package com.allwees.bs.module.lms.track;

import lombok.Getter;

import java.util.Arrays;

/**
 * @Author Daniel
 * @Version 1.0.0
 * @Description
 * @CreateTime 2020/9/23 9:16
 */
@Getter
public enum TrackResultCode {
    CODE_200(200, "Success", "请求成功"),
    CODE_201(201, "Created", "请求成功,但该单号在此前已被添加"),
    CODE_202(202, "Bad Request", "请求成功，但请求数量超过限制"),
    CODE_401(401, "Unauthorized", "身份验证失败，或不具备该操作的权限"),
    CODE_402(402, "Payment Required", "订单未支付"),
    CODE_403(403, "Server Error", "请求被拒绝"),
    CODE_404(404, "Not Found", "无法找到对应的资源"),
    CODE_405(405, "Method Not Allowed", "不支持该请求的方式，请更换请求方式"),
    CODE_409(409, "Conflict", "由于冲突，请求无法完成"),
    CODE_429(429, "Too Many Requests", "超过API请求限制，请稍后再尝试提交请求"),
    CODE_4001(4001, "Unauthorized", "无效的API密钥"),
    CODE_4002(4002, "Unauthorized", "API密钥已被删除"),
    CODE_4012(4012, "Bad Request", "请求无法被理解，或者缺少必填参数"),
    CODE_4013(4013, "Bad Request", "缺少参数 tracking_number"),
    CODE_4014(4014, "Bad Request", "参数 tracking_number 格式错误"),
    CODE_4015(4015, "Bad Request", "参数 carrier_code 无效"),
    CODE_4016(4016, "Bad Request", "快递单号已存在"),
    CODE_4017(4017, "Bad Request", "快递单号不存在"),
    CODE_4018(4018, "Bad Request", "由于存在过载风险，此功能需要人工激活，请联系 service@51tracking.org获取相关信息"),
    CODE_4019(4019, "Bad Request", "余额不足，请充值"),
    CODE_4020(4020, "Request error", "一次最多可限制2000个"),
    CODE_4021(4021, "Request error", "您的余额还不够，因此您无法调用API请求数据"),
    CODE_4031(4031, "No Content", "单号创建错误，请先调用POST /trackings/post 接口创建单号，再调用 GET /trackings/get查询结果"),
    CODE_4032(4032, "No Content", "无法检测到快递运输商。 请给快递单号指定相应运输商简码来查询信息"),
    CODE_4033(4033, "No Content", "“快递状态”的值无效"),
    CODE_500(500, "Server Error", "服务器发生错误"),
    CODE_503(503, "Service Unavailable", "服务器暂时不可用（由于维护等原因），请稍后再");

    private int code;
    private String descEn;
    private String descCn;

    TrackResultCode(int code, String en, String cn) {
        this.code = code;
        this.descEn = en;
        this.descCn = cn;
    }

    public static TrackResultCode getResultCode(int code){
        return Arrays
                .stream(TrackResultCode.values())
                .filter(trc -> trc.code == code)
                .findFirst()
                .orElseThrow(() -> new RuntimeException("unknown result code:" + code));
    }
}

//        状态	              描述
//        pending	          查询中：新增包裹正在查询中，请等待
//        notfound	          查询不到：包裹信息目前查询不到
//        transit	          运输途中：物流商已揽件，包裹正被发往目的地
//        pickup	          到达待取：包裹正在派送中，或到达当地收发点
//        delivered	          成功签收：包裹已被成功投递
//        expired	          运输过久：包裹在很长时间内都未投递成功。快递包裹超过30天、邮政包裹超过60天未投递成功，该查询会被识别为此状态
//        undelivered	      投递失败：快递员投递失败（通常会留有通知并再次尝试投递）
//        exception	          可能异常：包裹退回、包裹丢失、清关失败等异常情况
//======================      ================================================================================================
//        查询不到子状态	      描述
//        notfound001	      包裹正在等待被揽件
//        notfound002	      无任何物流信息
//======================      ================================================================================================
//        运输途中子状态	      描述
//        transit001	      包裹正在运输途中
//        transit002	      包裹到达分捡中心
//        transit003	      包裹到达目的网点
//        transit004	      包裹达到目的国家
//        transit005	      包裹清关完成
//======================      ================================================================================================
//        成功签收子状态	      描述
//        delivered001	      包裹投递成功
//        delivered002	      客户自提成功
//        delivered003	      包裹由客户签字签收
//        delivered004	      包裹放至快递柜，或由物业、门卫代收
//======================      ================================================================================================
//        可能异常子状态	      描述
//        exception004	      包裹无人认领
//        exception005	      其他异常情况
//        exception006	      包裹被海关扣留
//        exception007	      包裹破损、遗失或被丢弃
//        exception008	      订单在揽件前被取消
//        exception009	      收件人拒收包裹
//        exception0010	      包裹已退回发件人处
//        exception0011	      包裹正在被退回发件人的途中
